#include "common.h"
/**
 * 给你一个整数数组 nums 和一个整数 x 。每一次操作时，你应当移除数组 nums 最左边或最右边的元素，然后从 x 中减去该元素的值。请注意，需要 修改 数组以供接下来的操作使用。

如果可以将 x 恰好 减到 0 ，返回 最小操作数 ；否则，返回 -1 。
 */
// 不行
class Solution
{
public:
    int minOperations(vector<int> &nums, int x)
    {
        int sz = nums.size();
        int left = 0, right = sz - 1;
        int ops = 0;
        while (left < right)
        {
            if (x == 0)
            {
                return ops;
            }
            if (x < 0)
                return -1;
            if (nums[left] <= nums[right] && x >= nums[right])
            {
                x -= nums[right];
                --right;
            }
            else if (nums[left] >= nums[right] && x >= nums[left])
            {
                x -= nums[left];
                ++left;
            }
            else if (nums[left] > x && nums[right] <= x)
            {
                x -= nums[right];
                --right;
            }
            else if (nums[right] > x && nums[left] <= x)
            {
                x -= nums[left];
                ++left;
            }
            else
            {
                return -1;
            }
            ++ops;
        }
        return ops;
    }
};

class Solution
{
public:
    int minOperations(vector<int> &nums, int x)
    {
        int sz = nums.size();
        int left = 0, right = 0;
        int ops = sz + 1;
        int sum = 0;
        int target = Sum(nums) - x;
        if(target < 0) return -1;
        while (right < sz)
        {
            sum += nums[right];
            while (sum > target)
            {
                sum -= nums[left];
                ++left;
            }
            if (sum == target)
            {
                ops = min(ops, sz - right + left - 1);
            }
            ++right;
        }
        return ops == sz + 1 ? -1 : ops;
    }
    int Sum(vector<int> &nums)
    {
        int sum = 0;
        for (auto &element : nums)
        {
            sum += element;
        }
        return sum;
    }
};